]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
First stab at showing windows in the overlay
authorOwen Taylor <otaylor@src.gnome.org>
Sun, 2 Nov 2008 04:18:41 +0000 (04:18 +0000)
committerOwen Taylor <otaylor@src.gnome.org>
Sun, 2 Nov 2008 04:18:41 +0000 (04:18 +0000)
shell-global.[ch]: Add shell_global_get_windows() to get
  the list of all MutterWindow for the  screen
Makefile.am: Include the metacity typelib so that we can
  reference the MutterWindow type
js/ui/overlay.js: Cascade the open windows, scaled down
  in the overlay

svn path=/trunk/; revision=24

js/ui/overlay.js
src/Makefile.am
src/metacity-symbols.c
src/shell-global.c
src/shell-global.h

index 5504182ad5a572c369b43df6b6bd01ec465b869c..a58e0bd07879e50c0e4330a0f536bcc82ca21717 100644 (file)
@@ -29,11 +29,58 @@ Overlay.prototype = {
 
        this._group.hide();
        global.overlay_group.add_actor(this._group);
+
+       this._window_clones = []
     },
 
     show : function() {
        if (!this.visible) {
            this.visible = true;
+
+           // Very simple version of a window overview ... when we show the
+           // overlay, display all the user's windows in the overlay scaled
+           // down.
+           //
+           // We show the window using "clones" of the texture .. separate
+           // actors that mirror the original actors for the window. For
+           // animation purposes, it may be better to actually move the
+           // original actors about instead.
+
+           let global = Shell.global_get();
+           let windows = global.get_windows();
+       
+           let screen_width = global.screen_width
+           let screen_height = global.screen_height
+
+           let x = screen_width / 4
+           let y = screen_height / 4
+    
+           for (let i = 0; i < windows.length; i++)
+               if (!windows[i].is_override_redirect()) {
+                   let clone = new Clutter.CloneTexture({ parent_texture: windows[i].get_texture(),
+                                                          x: x,
+                                                          y: y });
+
+                   // We scale each window down so that it is at most 300x300, but we 
+                   // never want to scale a window up.
+                   let size = clone.width;
+                   if (clone.height > size)
+                       size = clone.height;
+
+                   let scale = 300 / size;
+                   if (scale > 1)
+                       scale = 1;
+                   
+                   clone.set_scale(scale, scale);
+                   this._group.add_actor(clone);
+                   this._window_clones.push(clone);
+
+                   // Windows are overlapped diagonally. If there are too many, they'll
+                   // end up off the screen
+                   x += 50;
+                   y += 50;
+               }
+           
            this._group.show();
        }
     },
@@ -42,6 +89,12 @@ Overlay.prototype = {
        if (this.visible) {
            this.visible = false;
            this._group.hide();
+
+           for (let i = 0; i < this._window_clones.length; i++) {
+               this._window_clones[i].destroy();
+           }
+
+           this._window_clones = [];
        }
     }
 };
index 8fb38e4d4a60f22c6fe598f59628ef0188365ba8..7eeede8b3c695ae954b02fd590b7a1c33ce35d69 100644 (file)
@@ -38,6 +38,7 @@ Shell-0.1.gir: libgnome-shell-introspect.la $(libgnome_shell_la_SOURCES)
                --nsversion=0.1                         \
                --include=GObject-2.0                   \
                --include=Clutter-0.8                   \
+               --include=Meta-2.25                     \
                --library=gnome-shell-introspect        \
                $(libgnome_shell_la_SOURCES)            \
                $(INCLUDES)                             \
index b542075332c9a5bff0067bb05d533997d9e77178..29e559c303c63f688ba8436173924a82c2a39390 100644 (file)
@@ -14,6 +14,11 @@ mutter_plugin_get_stage (MutterPlugin *plugin)
   return NULL;
 }
 
+GList *
+mutter_plugin_get_windows (MutterPlugin *plugin)
+{
+}
+
 void
 mutter_plugin_query_screen_size (MutterPlugin *plugin,
                                  int          *width,
index 975b4f5286c2cf7a3ab6ac89a007c33250553118..4db582460784706acdad6117c3777b0eb7636285 100644 (file)
@@ -159,6 +159,21 @@ shell_global_set_stage_input_area (ShellGlobal *global,
   mutter_plugin_set_stage_input_area (global->plugin, x, y, width, height);
 }
 
+/**
+ * shell_global_get_windows:
+ *
+ * Gets the list of MutterWindows for the plugin's screen
+ *
+ * Return value: (element-type MutterWindow) (transfer none): the list of windows
+ */
+GList *
+shell_global_get_windows (ShellGlobal *global)
+{
+  g_return_if_fail (SHELL_IS_GLOBAL (global));
+
+  return mutter_plugin_get_windows (global->plugin);
+}
+
 void
 _shell_global_set_plugin (ShellGlobal  *global,
                           MutterPlugin *plugin)
index 83a355f0c92bfe4780b07a54e7335a6479d3666d..b33d499091e31fd336e396861b2ff0d9a84d7607 100644 (file)
@@ -21,12 +21,13 @@ GType            shell_global_get_type            (void) G_GNUC_CONST;
 
 ShellGlobal *shell_global_get (void);
 
-void
-shell_global_set_stage_input_area (ShellGlobal *global,
-                                   int          x,
-                                   int          y,
-                                   int          width,
-                                   int          height);
+void shell_global_set_stage_input_area (ShellGlobal *global,
+                                       int          x,
+                                       int          y,
+                                       int          width,
+                                       int          height);
+
+GList *shell_global_get_windows (ShellGlobal *global);
 
 void _shell_global_set_plugin (ShellGlobal  *global,
                               MutterPlugin *plugin);